/*
 * Copyright (c) 2023 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include "core/interfaces/native/node/node_api.h"

#include "core/interfaces/native/node/alphabet_indexer_modifier.h"
#include "core/interfaces/native/node/blank_modifier.h"
#include "core/interfaces/native/node/button_modifier.h"
#include "core/interfaces/native/node/calendar_picker_modifier.h"
#include "core/interfaces/native/node/checkboxgroup_modifier.h"
#include "core/interfaces/native/node/column_modifier.h"
#include "core/interfaces/native/node/column_split_modifier.h"
#include "core/interfaces/native/node/common_shape_modifier.h"
#include "core/interfaces/native/node/counter_modifier.h"
#include "core/interfaces/native/node/data_panel_modifier.h"
#include "core/interfaces/native/node/divider_modifier.h"
#include "core/interfaces/native/node/flex_modifier.h"
#include "core/interfaces/native/node/frame_node_modifier.h"
#include "core/interfaces/native/node/gauge_modifier.h"
#include "core/interfaces/native/node/grid_col_modifier.h"
#include "core/interfaces/native/node/grid_item_modifier.h"
#include "core/interfaces/native/node/grid_modifier.h"
#include "core/interfaces/native/node/grid_row_modifier.h"
#include "core/interfaces/native/node/hyperlink_modifier.h"
#include "core/interfaces/native/node/image_animator_modifier.h"
#include "core/interfaces/native/node/line_modifier.h"
#include "core/interfaces/native/node/node_list_item_modifier.h"
#include "core/interfaces/native/node/marquee_modifier.h"
#include "core/interfaces/native/node/node_relative_container_modifier.h"
#include "core/interfaces/native/node/menu_item_modifier.h"
#include "core/interfaces/native/node/menu_modifier.h"
#include "core/interfaces/native/node/nav_destination_modifier.h"
#include "core/interfaces/native/node/nav_router_modifier.h"
#include "core/interfaces/native/node/navigation_modifier.h"
#include "core/interfaces/native/node/navigator_modifier.h"
#include "core/interfaces/native/node/node_checkbox_modifier.h"
#include "core/interfaces/native/node/node_common_modifier.h"
#include "core/interfaces/native/node/node_container_modifier.h"
#include "core/interfaces/native/node/node_content_modifier.h"
#include "core/interfaces/native/node/node_date_picker_modifier.h"
#include "core/interfaces/native/node/node_gesture_modifier.h"
#include "core/interfaces/native/node/node_image_modifier.h"
#include "core/interfaces/native/node/node_image_span_modifier.h"
#include "core/interfaces/native/node/node_list_item_group_modifier.h"
#include "core/interfaces/native/node/node_list_modifier.h"
#include "core/interfaces/native/node/node_loading_progress_modifier.h"
#include "core/interfaces/native/node/node_refresh_modifier.h"
#include "core/interfaces/native/node/node_scroll_modifier.h"
#include "core/interfaces/native/node/node_slider_modifier.h"
#include "core/interfaces/native/node/node_span_modifier.h"
#include "core/interfaces/native/node/node_stack_modifier.h"
#include "core/interfaces/native/node/node_folder_stack_modifier.h"
#include "core/interfaces/native/node/node_swiper_modifier.h"
#include "core/interfaces/native/node/node_text_area_modifier.h"
#include "core/interfaces/native/node/node_text_input_modifier.h"
#include "core/interfaces/native/node/node_text_modifier.h"
#include "core/interfaces/native/node/node_textpicker_modifier.h"
#include "core/interfaces/native/node/node_timepicker_modifier.h"
#include "core/interfaces/native/node/node_toggle_modifier.h"
#include "core/interfaces/native/node/panel_modifier.h"
#include "core/interfaces/native/node/particle_modifier.h"
#include "core/interfaces/native/node/path_modifier.h"
#include "core/interfaces/native/node/pattern_lock_modifier.h"
#include "core/interfaces/native/node/polygon_modifier.h"
#include "core/interfaces/native/node/polyline_modifier.h"
#include "core/interfaces/native/node/progress_modifier.h"
#include "core/interfaces/native/node/qrcode_modifier.h"
#include "core/interfaces/native/node/radio_modifier.h"
#include "core/interfaces/native/node/rating_modifier.h"
#include "core/interfaces/native/node/rect_modifier.h"
#include "core/interfaces/native/node/render_node_modifier.h"
#include "core/interfaces/native/node/rich_editor_modifier.h"
#include "core/interfaces/native/node/row_modifier.h"
#include "core/interfaces/native/node/row_split_modifier.h"
#include "core/interfaces/native/node/scroller_modifier.h"
#include "core/interfaces/native/node/search_modifier.h"
#include "core/interfaces/native/node/select_modifier.h"
#include "core/interfaces/native/node/swiper_controller_modifier.h"
#include "core/interfaces/native/node/rich_editor_modifier.h"
#include "core/interfaces/native/node/shape_modifier.h"
#include "core/interfaces/native/node/side_bar_container_modifier.h"
#include "core/interfaces/native/node/stepper_item_modifier.h"
#include "core/interfaces/native/node/flex_modifier.h"
#include "core/interfaces/native/node/node_gesture_modifier.h"
#include "core/interfaces/native/node/node_refresh_modifier.h"
#include "core/interfaces/native/node/node_symbol_glyph_modifier.h"
#include "core/interfaces/native/node/node_symbol_span_modifier.h"
#include "core/interfaces/native/node/tab_content_modifier.h"
#include "core/interfaces/native/node/tabs_modifier.h"
#include "core/interfaces/native/node/text_clock_modifier.h"
#include "core/interfaces/native/node/text_timer_modifier.h"
#include "core/interfaces/native/node/video_modifier.h"
#include "core/interfaces/native/node/water_flow_modifier.h"
#include "core/interfaces/native/node/node_container_span_modifier.h"

#ifdef MODEL_COMPONENT_SUPPORTED
#include "core/interfaces/native/node/node_component3d_modifier.h"
#endif

#ifdef PLUGIN_COMPONENT_SUPPORTED
#include "core/interfaces/native/node/plugin_modifier.h"
#endif

#ifdef XCOMPONENT_SUPPORTED
#include "core/interfaces/native/node/node_xcomponent_modifier.h"
#endif

#ifdef FORM_SUPPORTED
#include "core/interfaces/native/node/form_component_modifier.h"
#endif

namespace Keels::Ace::NG {
namespace {
// clang-format off
const ArkUINodeModifiers impl = {
    ARKUI_NODE_MODIFIERS_API_VERSION,
    NodeModifier::GetCommonModifier,
    nullptr, // NodeModifier::GetCheckboxGroupModifier,
    nullptr, // NodeModifier::GetCounterModifier,
    nullptr, // NodeModifier::GetRowModifier,
    nullptr, // NodeModifier::GetRowSplitModifier,
    NodeModifier::GetTextModifier,
    NodeModifier::GetButtonModifier,
    nullptr, // NodeModifier::GetToggleModifier,
    nullptr, // NodeModifier::GetImageSpanModifier,
    NodeModifier::GetBlankModifier,
    nullptr, // NodeModifier::GetSearchModifier,
    nullptr, // NodeModifier::GetSelectModifier,
    nullptr, // NodeModifier::GetRadioModifier,
    nullptr, // NodeModifier::GetCheckboxModifier,
    nullptr, // NodeModifier::GetTimepickerModifier,
    nullptr, // NodeModifier::GetTextPickerModifier,
    nullptr, // NodeModifier::GetRatingModifier,
    nullptr, // NodeModifier::GetSliderModifier,
    NodeModifier::GetDividerModifier,
    NodeModifier::GetStackModifier,
    NodeModifier::GetFolderStackModifier,
    nullptr, // NodeModifier::GetNavDestinationModifier,
    nullptr, // NodeModifier::GetGridModifier,
    nullptr, // NodeModifier::GetGridColModifier,
    nullptr, // NodeModifier::GetGridRowModifier,
    nullptr, // NodeModifier::GetPanelModifier,
    NodeModifier::GetTextAreaModifier,
    nullptr, // NodeModifier::GetNavigationModifier,
    NodeModifier::GetColumnModifier,
    nullptr, // NodeModifier::GetRichEditorModifier,
    NodeModifier::GetImageModifier,
    nullptr, // NodeModifier::GetVideoModifier,
    nullptr,
    nullptr, // NodeModifier::GetNavigatorModifier,
    nullptr, // NodeModifier::GetNavRouterModifier,
    nullptr, // NodeModifier::GetNodeContainerModifier,
    nullptr, // NodeModifier::GetPatternLockModifier,
#ifdef LINEAR_SPLIT_SUPPORTED
    NodeModifier::GetColumnSplitModifier,
#else
    nullptr, // NodeModifier::GetColumnSplitModifier,
#endif
#ifdef SHAPE_SUPPORTED
    NodeModifier::GetLineModifier,
    NodeModifier::GetPathModifier,
    nullptr, // NodeModifier::GetPolygonModifier,
    nullptr, // NodeModifier::GetPolylineModifier,
#else
    nullptr, // NodeModifier::GetLineModifier,
    nullptr, // NodeModifier::GetPathModifier,
    nullptr, // NodeModifier::GetPolygonModifier,
    nullptr, // NodeModifier::GetPolylineModifier,
#endif
    nullptr, // NodeModifier::GetSpanModifier,
    nullptr, // NodeModifier::GetImageAnimatorModifier,
    nullptr, // NodeModifier::GetSideBarContainerModifier,
    nullptr, // NodeModifier::GetCalendarPickerModifier,
    nullptr, // NodeModifier::GetTextInputModifier,
    nullptr, // NodeModifier::GetTabsModifier,
    nullptr, // NodeModifier::GetStepperItemModifier,
    nullptr, // NodeModifier::GetHyperlinkModifier,
    nullptr, // NodeModifier::GetMarqueeModifier,
    nullptr, // NodeModifier::GetMenuItemModifier,
    nullptr, // NodeModifier::GetMenuModifier,
    nullptr, // NodeModifier::GetDatePickerModifier,
    nullptr, // NodeModifier::GetWaterFlowModifier,
    nullptr, // NodeModifier::GetAlphabetIndexerModifier,
    nullptr, // NodeModifier::GetDataPanelModifier,
    nullptr, // NodeModifier::GetGaugeModifier,
    nullptr, // NodeModifier::GetScrollModifier,
    nullptr, // NodeModifier::GetGridItemModifier,
    nullptr, // NodeModifier::GetProgressModifier,
    nullptr, // NodeModifier::GetCommonShapeModifier,
#ifdef SHAPE_SUPPORTED
    nullptr, // NodeModifier::GetShapeModifier,
    nullptr, // NodeModifier::GetRectModifier,
#else
    nullptr, // NodeModifier::GetShapeModifier,
    nullptr, // NodeModifier::GetRectModifier,
#endif
    nullptr, // NodeModifier::GetSwiperModifier,
    nullptr, // NodeModifier::GetListItemModifier,
    nullptr, // NodeModifier::GetListModifier,
    nullptr, // NodeModifier::GetListItemGroupModifier,
    nullptr, // NodeModifier::GetQRCodeModifier,
    nullptr, // NodeModifier::GetLoadingProgressModifier,
    nullptr, // NodeModifier::GetTextClockModifier,
    nullptr, // NodeModifier::GetTextTimerModifier,
    NodeModifier::GetRenderNodeModifier,
    NodeModifier::GetFrameNodeModifier,

#ifdef PLUGIN_COMPONENT_SUPPORTED
    NodeModifier::GetPluginModifier,
#else
    nullptr,
#endif

#ifdef XCOMPONENT_SUPPORTED
    nullptr, // NodeModifier::GetXComponentModifier,
#else
    nullptr,
#endif

    NodeModifier::GetUIStateModifier,

#ifdef FORM_SUPPORTED
    NodeModifier::GetFormComponentModifier,
#else
    nullptr,
#endif
    NodeModifier::GetFlexModifier, // FlexModifier
    nullptr,                       // ScrollBarModifier
    nullptr, // NodeModifier::GetScrollerModifier,
    nullptr, // NodeModifier::GetTabContentModifier,
    nullptr, // TabsControllerModifier
    nullptr, // NodeModifier::GetSwiperControllerModifier,
    NodeModifier::GetGestureModifier,           // GestureModifier
    nullptr,                                    // BadgeModifier
    nullptr,                                    // WebModifier
    nullptr, // NodeModifier::GetRefreshModifier,           // RefreshModifier
    nullptr,                                    // MenuItemGroupModifier
    nullptr,                                    // SearchControllerModifier
    nullptr,                                    // SideBarModifier
    nullptr,                                    // PatternLockControllerModifier
    nullptr,                                    // TextTimerControllerModifier
    nullptr,                                    // TextClockControllerModifier
    nullptr,                                    // RichEditorControllerModifier
    nullptr,                                    // TextAreaControllerModifier
    nullptr, // NodeModifier::GetRelativeContainerModifier, // RelativeContainerModifier
    NodeModifier::GetNodeContentModifier,
    nullptr, // NodeModifier::GetParticleModifier,
    nullptr, // NodeModifier::GetSymbolGlyphModifier,
    NodeModifier::GetSymbolSpanModifier,

#ifdef MODEL_COMPONENT_SUPPORTED
    NodeModifier::GetComponent3DModifier,
#else
    nullptr,
#endif

    nullptr, // NodeModifier::GetContainerSpanModifier,
};
// clang-format on
} // namespace

} // namespace Keels::Ace::NG

extern "C" {

const ArkUINodeModifiers* GetArkUINodeModifiers()
{
    return &Keels::Ace::NG::impl;
}

const CJUINodeModifiers* GetCJUINodeModifiers()
{
    static CJUINodeModifiers modifiers {
        ARKUI_NODE_MODIFIERS_API_VERSION,
        Keels::Ace::NG::NodeModifier::GetCJUICommonModifier,
        Keels::Ace::NG::NodeModifier::GetCJUICheckboxGroupModifier,
        Keels::Ace::NG::NodeModifier::GetCJUICounterModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIRowModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIRowSplitModifier,
        Keels::Ace::NG::NodeModifier::GetCJUITextModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIButtonModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIToggleModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIImageSpanModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIBlankModifier,
        Keels::Ace::NG::NodeModifier::GetCJUISearchModifier,
        Keels::Ace::NG::NodeModifier::GetCJUISelectModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIRadioModifier,
        Keels::Ace::NG::NodeModifier::GetCJUICheckboxModifier,
        Keels::Ace::NG::NodeModifier::GetCJUITimepickerModifier,
        Keels::Ace::NG::NodeModifier::GetCJUITextPickerModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIRatingModifier,
        Keels::Ace::NG::NodeModifier::GetCJUISliderModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIDividerModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIStackModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIFolderStackModifier,
        Keels::Ace::NG::NodeModifier::GetCJUINavDestinationModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIGridModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIGridColModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIGridRowModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIPanelModifier,
        Keels::Ace::NG::NodeModifier::GetCJUITextAreaModifier,
        Keels::Ace::NG::NodeModifier::GetCJUINavigationModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIColumnModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIRichEditorModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIImageModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIVideoModifier,
        nullptr,
        nullptr,
        Keels::Ace::NG::NodeModifier::GetCJUINavRouterModifier,
        Keels::Ace::NG::NodeModifier::GetCJUINodeContainerModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIPatternLockModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIColumnSplitModifier,
        Keels::Ace::NG::NodeModifier::GetCJUILineModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIPathModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIPolygonModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIPolylineModifier,
        Keels::Ace::NG::NodeModifier::GetCJUISpanModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIImageAnimatorModifier,
        Keels::Ace::NG::NodeModifier::GetCJUISideBarContainerModifier,
        Keels::Ace::NG::NodeModifier::GetCJUICalendarPickerModifier,
        Keels::Ace::NG::NodeModifier::GetCJUITextInputModifier,
        Keels::Ace::NG::NodeModifier::GetCJUITabsModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIStepperItemModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIHyperlinkModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIMarqueeModifier,
        nullptr,
        Keels::Ace::NG::NodeModifier::GetCJUIMenuModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIDatePickerModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIWaterFlowModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIAlphabetIndexerModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIDataPanelModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIGaugeModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIScrollModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIGridItemModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIProgressModifier,
        Keels::Ace::NG::NodeModifier::GetCJUICommonShapeModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIShapeModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIRectModifier,
        Keels::Ace::NG::NodeModifier::GetCJUISwiperModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIListItemModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIListModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIListItemGroupModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIQRCodeModifier,
        Keels::Ace::NG::NodeModifier::GetCJUILoadingProgressModifier,
        Keels::Ace::NG::NodeModifier::GetCJUITextClockModifier,
        Keels::Ace::NG::NodeModifier::GetCJUITextTimerModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIRenderNodeModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIFrameNodeModifier,

#ifdef PLUGIN_COMPONENT_SUPPORTED
        Keels::Ace::NG::NodeModifier::GetCJUIPluginModifier,
#else
        nullptr,
#endif

#ifdef XCOMPONENT_SUPPORTED
        Keels::Ace::NG::NodeModifier::GetCJUIXComponentModifier,
#else
        nullptr,
#endif

        Keels::Ace::NG::NodeModifier::GetCJUIStateModifier,

#ifdef FORM_SUPPORTED
        Keels::Ace::NG::NodeModifier::GetCJUIFormComponentModifier,
#else
        nullptr,
#endif
        Keels::Ace::NG::NodeModifier::GetCJUIFlexModifier, // FlexModifier
        nullptr,                                           // ScrollBarModifier
        Keels::Ace::NG::NodeModifier::GetCJUIScrollerModifier,
        Keels::Ace::NG::NodeModifier::GetCJUITabContentModifier,
        nullptr, // TabsControllerModifier
        Keels::Ace::NG::NodeModifier::GetCJUISwiperControllerModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIGestureModifier,           // GestureModifier
        nullptr,                                                        // BadgeModifier
        nullptr,                                                        // WebModifier
        Keels::Ace::NG::NodeModifier::GetCJUIRefreshModifier,           // RefreshModifier
        nullptr,                                                        // MenuItemGroupModifier
        nullptr,                                                        // SearchControllerModifier
        nullptr,                                                        // SideBarModifier
        nullptr,                                                        // PatternLockControllerModifier
        nullptr,                                                        // TextTimerControllerModifier
        nullptr,                                                        // TextClockControllerModifier
        nullptr,                                                        // RichEditorControllerModifier
        nullptr,                                                        // TextAreaControllerModifier
        Keels::Ace::NG::NodeModifier::GetCJUIRelativeContainerModifier, // RelativeContainerModifier
        Keels::Ace::NG::NodeModifier::GetCJUINodeContentModifier,
        Keels::Ace::NG::NodeModifier::GetCJUIParticleModifier,
        Keels::Ace::NG::NodeModifier::GetCJUISymbolGlyphModifier,
        Keels::Ace::NG::NodeModifier::GetCJUISymbolSpanModifier,

#ifdef MODEL_COMPONENT_SUPPORTED
        Keels::Ace::NG::NodeModifier::GetCJUIComponent3DModifier,
#else
        nullptr,
#endif

        Keels::Ace::NG::NodeModifier::GetCJUIContainerSpanModifier,
    };
    return &modifiers;
}
}
